package cn.ssm.controller;

import cn.ssm.pojo.User;
import cn.ssm.service.UserService;
import com.sun.xml.internal.messaging.saaj.packaging.mime.MessagingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Controller
public class UserController {
    Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private UserService  userService;
    @GetMapping("/users")
    public String list(Map<String, Object> map, User user) {

        List<User> users = userService.getUsers(user);
        map.put("users", users);

        return "user/list";
    }

    /**
     * type = null 进入查看详情页面view.html，
     * type=update 则是进入update.html
     * @return
     */
    @GetMapping("/user/{id}")
    public String view(@PathVariable("id") Integer id,
                       @RequestParam(value="type", defaultValue = "view") String type,
                       Map<String, Object> map) {
        logger.info("查看用户信息。。。"+id);
        User userByBid = userService.getUserByBid(id);
        map.put("userByBid", userByBid);

        // type = null 则进入view.html， type=update 则是进入update.html
        return "user/" + type;
    }

    //修改信息
    @PutMapping("/user")
    public String update(User user) {
        //更新操作
        logger.info("更改信息。。。"+user);
        userService.updateUser(user);

        return "redirect:/users";
    }

    //前往添加 页面
    @GetMapping("/user")
    public String toAddPage() {
        return "user/add";
    }


    //添加数据
    @PostMapping("/user")
    public String add( User user) {
        logger.info("添加用户"+user);

        userService.addUser(user);
        return "redirect:/users";
    }

    //删除
    @DeleteMapping("/user/{id}")
    public String delete(@PathVariable("id") Integer id) {
        userService.deteleUserByBid(id);
        return "redirect:/users";
    }
    //前往改密码页面
    @GetMapping("/usermm")
    public String toAddPage1() {
        return "main/password";
    }
    //修改密码
    /**
     * 处理用户密码修改请求
     * 该方法通过PUT请求接收用户信息，包括用户名、旧密码、新密码和确认密码
     * 目的是验证用户身份并更新用户的密码
     *
     * @param username 用户名，用于识别用户
     * @param oldPassword 旧密码，用于验证用户身份
     * @param newPassword 新密码，用户希望设置的新密码
     * @param confirmPassword 确认密码，确保用户两次输入的新密码一致
     * @return 如果密码修改成功，返回登录页面的路径；否则，返回错误信息
     */
    @PostMapping("/usermm")
    public String mm(
            @RequestParam("username") String username,
            @RequestParam("oldPassword") String oldPassword,
            @RequestParam("newPassword") String newPassword,
            @RequestParam("confirmPassword") String confirmPassword,
            Map<String, Object> map, HttpServletRequest request){

        // 记录日志信息，表示正在更改用户信息
        logger.info("更改信息。。。");

        // 更新操作
        // 验证用户输入的用户名和旧密码是否正确
        User m = userService.login(username, oldPassword);
        System.out.println(m);
        User mmm = userService.selectmm(username);
        logger.info("更改信息。。。"+mmm.getUserName());
        System.out.println(mmm.getUserName());
        System.out.println(username+"=========="+oldPassword);
        if (m != null) {
            // 如果新密码和确认密码一致，则更新用户密码
            if (newPassword.equals(confirmPassword)) {
                logger.info("sda");
                userService.updatemm(mmm.getUserName(),confirmPassword);
                logger.info("sda");
                // 密码更新成功，重到登录页面
                return "main/login";
            }
            map.put("msg","两次新密码密码错误");
            return "main/password";
        }
        // 如果输入的密码不一致或用户验证失败，返回错误信息（实际代码中应包含这部分逻辑）
        map.put("msg", "用户名或旧密码不相同");
        return "main/password";
    }
    //注册账号和密码
    @GetMapping("/zczm")
    public String zc(){
        return "main/zc";
    }
    private static final Long SESSION_TIMEOUT = 60 * 1000L;

    //注册
    @PostMapping("/zczm")
    public String zc1(
            HttpServletRequest request, String inputCaptcha,@RequestParam("username") String username,
                      @RequestParam("pwd") String pwd,
                      @RequestParam("c_pwd") String c_pwd, User user,
                      Map<String, Object> map) {
        logger.info("注册用户"+user);
        User mmm = userService.selectmm(username);
        if (!StringUtils.hasLength(inputCaptcha)){
            map.put("msg", "验证码不能为空！");
            return "/main/login";
        }
        if(mmm==null){
            logger.info("注册用户"+mmm+pwd+c_pwd);
          if (pwd.equals(c_pwd)) {
              //从Session中获取验证码
              String saveCaptcha = (String) request.getServletContext().getAttribute("captchaCode");
              Date saveDate = (Date) request.getServletContext().getAttribute("captchaDate");
              //比对验证码
              if (inputCaptcha.equals(saveCaptcha)) {
                  // 比对日期
                  if (saveDate == null || System.currentTimeMillis() - saveDate.getTime() < SESSION_TIMEOUT) {
                      logger.info("注册用户" + pwd + c_pwd);
                      userService.addzc(username, pwd);
                      map.put("msg", "注册成功");
                      return "main/login";
                  } else {
                      map.put("msg", "验证码过期，请重新输入！");
                      return "/main/zc";
                  }
                  // }
              } else {
                  map.put("msg", "验证码错误！");
                  return "/main/zc";
              }
          }
          map.put("msg","两次密码不一致");
          return "main/zc";
        }
        map.put("msg","用户名已存在");
        return "main/zc";
    }
    //前往联系我们
    @GetMapping("/lxwm")
    public String lxwm(){
        return "main/lxwm";
    }

    @Autowired
    private JavaMailSender mailSender;

    @PostMapping("/lxwm")
    /**
     * 发送联系邮件
     * 该方法用于发送来自网站访客的联系信息到指定的邮箱地址
     *
     * @param name 发送者姓名
     * @param email 发送者邮箱
     * @param message 发送者留言内容
     * @param map 用于存储反馈信息的映射对象
     * @return 返回到主页视图
     */
    public String sendContactEmail(@RequestParam String name,
                                   @RequestParam String email,
                                   @RequestParam String message, Map map) {
        try {
            // 创建MimeMessage对象
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            // 初始化MimeMessageHelper对象，便于设置邮件内容
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

            // 设置发件人地址
            helper.setFrom("2252056959@qq.com");
            // 设置收件人邮箱地址
            helper.setTo("2252056959@qq.com");
            // 设置邮件主题
            helper.setSubject("新联系信息");
            // 设置邮件内容，包括发送者的姓名、邮箱和留言内容
            helper.setText("姓名: " + name + "\n" +
                    "邮箱: " + email + "\n" +
                    "留言: " + message, false);

            // 发送邮件
            mailSender.send(mimeMessage);
        } catch (javax.mail.MessagingException e) {
            // 如果发送邮件过程中出现异常，抛出运行时异常
            throw new RuntimeException(e);
        }
        // 将反馈信息存入map中
        map.put("msg", "感谢您的反馈！");
        // 返回到主页视图
        return "main/lxwm";
    }

}
